# coding=utf-8
from utils.functions import pretty_print_dict
from collections import OrderedDict
from pprint import pprint
import aiomysql

async def get_prompt(content_text: str, problem_id_list: list):
    '''
    :param content_text: 招股书文本
    :param problem_id_list: 问题ID列表
    :return: promp_text: 提示词
    '''
    # 设置 问题id个数不超过3
    problem_id_list = problem_id_list[:3]

    conn = None
    cursor = None
    try:

        conn = await aiomysql.connect(
            host='192.168.2.244',
            port=3306,
            user='root',
            password='linkAge@12345',
            charset='utf8mb4',
            db='stock_exchange'
        )

        cursor = await conn.cursor()
        query_dict = OrderedDict()
        for index, id in enumerate(problem_id_list):
            query_dict[index] = OrderedDict()
            await cursor.execute("SELECT material_order, material_type, material_content FROM material WHERE problem_id = %s", (id,))
            material_results = await cursor.fetchall()
            material_text = ''
            for res in material_results:
                material_text += res[2]
            query_dict[index]['依据材料'] = material_text

            await cursor.execute("SELECT query_id, query_type, query_content FROM query WHERE problem_id = %s", (id,))
            query_results = await cursor.fetchall()
            for res in query_results:
                if str(res[1]) != '第三方核查':
                    query_dict[index]['请发行人说明/披露'] = res[2]
                else:
                    continue


        # pprint(query_dict)
        # query_dict = pretty_print_dict(query_dict)
        # print(pretty_print_dict(query_dict))
    except Exception as e:
        return f"C4 error : {e}"
        print(f"An error occurred: {e}")
    finally:
        if cursor:
            await cursor.close()  # 使用 await 关键字
        if conn:
            conn.close()

    prompt = f"""# CONTEXT #
<content_text>与</content_text>之中的为招股说明书中的某一段文本切片。
<query_dict>与</query_dict>之中的为提问字典；Key为索引，Value为一个字典{{"依据材料": "材料内容", "请发行人说明/披露": "问询问题"}}。\
<query_dict>与</query_dict>之中的每一个Value是一个dict。每一个dict代表交易所的历史审核问询中的最相似的某一个问询。\
其中，”依据材料“key的value是历史最相似问询所依据的招股说明书中的材料；”问询问题“key的value是其针对”依据材料“对发行人所提出的审核问询。
招股说明书：
<content_text>
{content_text}
</content_text>;
提问字典：
<query_dict>
{pretty_print_dict(query_dict)}
</query_dict>。
# OBJECTIVE #
从交易所的角度，基于<query_dict>与</query_dict>之中的历史相似问询问题，生成相应的<content_text>与</content_text>之间切片的最有可能被问询的问题。
# STYLE #
请以交易所IPO业务的外审人员的风格来进行问询，只输出”请发行人说明/披露“的内容。
# TONE #
正式。
# AUDIENCE #
我们的受众是投行IPO业务的内审人员和交易所IPO业务的外审人员。
# RESPONSE #
请严格遵循以上要求和下面输出示例的格式输出，不要输出“请发行人说明/披露”相关的标题!!!
请严格遵循以上要求和下面输出示例的格式输出，不要输出“请发行人说明/披露”相关的标题!!!

输出示例：
(1)...；
(2)...；
......
(n)...。
"""

    return prompt

async def get_prompt_db(pool: aiomysql.Pool,content_text: str, problem_id_list: list):
    '''
    :param content_text: 招股书文本
    :param problem_id_list: 问题ID列表
    :return: promp_text: 提示词
    '''
    # 设置 问题id个数不超过3
    problem_id_list = problem_id_list[:3]

    try:
        if not pool:
            raise RuntimeError("数据库连接池未初始化")

        async with pool.acquire() as conn:
            async with conn.cursor() as cursor:
                query_dict = OrderedDict()
                for index, id in enumerate(problem_id_list):
                    query_dict[index] = OrderedDict()
                    await cursor.execute("SELECT material_order, material_type, material_content FROM material WHERE problem_id = %s", (id,))
                    material_results = await cursor.fetchall()
                    material_text = ''
                    for res in material_results:
                        material_text += res[2]
                    query_dict[index]['依据材料'] = material_text

                    await cursor.execute("SELECT query_id, query_type, query_content FROM query WHERE problem_id = %s", (id,))
                    query_results = await cursor.fetchall()
                    for res in query_results:
                        if str(res[1]) != '第三方核查':
                            query_dict[index]['请发行人说明/披露'] = res[2]
                        else:
                            continue

    except Exception as e:
        return f"C4 error : {e}"
        print(f"An error occurred: {e}")
    # finally:
    #     if pool:
    #         pool.close()
    #         await pool.wait_closed()
    #         print("数据库连接池已关闭")

    prompt = f"""# CONTEXT #
<content_text>与</content_text>之中的为招股说明书中的某一段文本切片。
<query_dict>与</query_dict>之中的为提问字典；Key为索引，Value为一个字典{{"依据材料": "材料内容", "请发行人说明/披露": "问询问题"}}。\
<query_dict>与</query_dict>之中的每一个Value是一个dict。每一个dict代表交易所的历史审核问询中的最相似的某一个问询。\
其中，”依据材料“key的value是历史最相似问询所依据的招股说明书中的材料；”问询问题“key的value是其针对”依据材料“对发行人所提出的审核问询。
招股说明书：
<content_text>
{content_text}
</content_text>;
提问字典：
<query_dict>
{pretty_print_dict(query_dict)}
</query_dict>。
# OBJECTIVE #
从交易所的角度，基于<query_dict>与</query_dict>之中的历史相似问询问题，生成相应的<content_text>与</content_text>之间切片的最有可能被问询的问题。
# STYLE #
请以交易所IPO业务的外审人员的风格来进行问询，只输出”请发行人说明/披露“的内容。
# TONE #
正式。
# AUDIENCE #
我们的受众是投行IPO业务的内审人员和交易所IPO业务的外审人员。
# RESPONSE #
请严格遵循以上要求和下面输出示例的格式输出，不要输出“请发行人说明/披露”相关的标题!!!
请严格遵循以上要求和下面输出示例的格式输出，不要输出“请发行人说明/披露”相关的标题!!!

输出示例：
(1)...；
(2)...；
......
(n)...。
"""

    return prompt

if __name__ == '__main__':
    import asyncio

    # content_text = '招股书文本'

    content_text = '发行人与齐齐哈尔博实畜牧服务有限公司就支持和牛养殖事宜签署了《支持和牛养殖协议》，约定发行人为齐齐哈尔博实畜牧服务有限公司提供6,000万元额度的专项资金支持，用于和牛养殖服务；齐齐哈尔博实畜牧服务有限公司以其拥有的牛只对上述专项资金支持额度提供抵押担保，齐齐哈尔博实畜牧服务有限公司的直接股东彭辉及关联方龙江县彭辉肉牛养殖场、龙江黑牛牧业有限公司梅里斯分公司提供连带责任保证。'
    problem_id_list = [297, 401, 807]
    prompt = asyncio.run(get_prompt(content_text, problem_id_list))
    print(prompt)
